package com._119yn.host.gst200.cansocket.codec;

import com._119yn.host.gst200.model.Signal;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Gst200CanFrameEncoder extends ChannelOutboundHandlerAdapter {

    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        if (msg instanceof Signal frame) {
            handle(frame);
            ctx.write(frame);
        } else {
            ctx.write(msg);
        }
    }

    private void handle(Signal frame) {
        // 14A00B0A
        // 00010100101000000000101100001010
        String canId = "%01X%03X%02X%02X".formatted(frame.getCall(), (frame.getCode() << 5) | (frame.getMark() << 2), frame.getHost(), frame.getSequence());
//        frame.setCanId(canId);
//
//        int code = frame.getCode();
//
//        switch (code) {
//            case 0x28 -> {
//                frame.setCanData("011200100A002D00");
//            }
//            case 0x29 -> {
//                frame.setCanData("011200100A002D00");
//            }
//            case 0x2A -> {
//                frame.setCanData("011200100A002D00");
//            }
//            case 0x2B -> {
//                frame.setCanData("011200100A002D00");
//            }
//            case 0x27 -> {
//                if (frame.getActCode() == 1) {
//                    frame.setCanData("E44000000A002E00");
//                } else {
//                    frame.setCanData("A44000000A00EE00");
//                }
//            }
//            // 通用
//            default -> {
//                frame.setCanData("0000000000000000");
//            }
//        }
        // 复位
        // frame.setCanData("005555550000FF00");
        // 消音
        // frame.setCanData("004000000A004A00");
        // frame.setCanData("001200100A002C00");
        byte[] data = new byte[8];
//        data[0] = (byte) (frame.getDevCode() & 0xFF);
//        data[1] = (byte) (frame.getDevCode() & 0xFF);
//        data[2] = (byte) (frame.getDevCode() & 0xFF);
//        data[3] = (byte) (frame.getDevType() & 0xFF);
//        data[4] = (byte) (frame.getActCode() & 0xFF);
//        data[5] = (byte) (frame.getActCode() & 0xFF);
//        data[6] = (byte) (frame.getActCode() & 0xFF);
        //frame.setLineData(frame.getCanId() + "#" + frame.getCanData());
    }

}
